Решение задачи

На плоскости задано множество точек с целочисленными координатами.
Необходимо найти количество отрезков, обладающих следующими
свойствами:
1) оба конца отрезка принадлежат заданному множеству;
2) ни один конец отрезка не лежит на осях координат;
3) отрезок пересекается с обеими осями координат.
Напишите эффективную по времени и по используемой памяти программу
для решения этой задачи.
Программа считается эффективной по времени, если при увеличении
количества точек в k раз время работы возрастает не более чем в k раз.
Программа считается эффективной по памяти, если размер памяти для
хранения всех необходимых данных не зависит от количества точек и не
превышает 1 килобайта.
Перед текстом программы кратко опишите алгоритм решения и укажите
язык программирования и его версию.

Входные данные
В первой строке задаётся N – количество точек в заданном множестве.
Каждая из следующих строк содержит два целых числа x и y – координаты
очередной точки. Гарантируется, что 1 ≤ N ≤ 10000; –1000 ≤ x, y ≤ 1000.
Пример входных данных:
4
6 6
-8 8
-9 -9
7 -5

Выходные данные
Необходимо вывести единственное число: количество удовлетворяющих
требованиям отрезков.
Пример выходных данных для приведённого выше примера входных данных:
2

Решение
Пронумеруем координатные области 1 от до 4.
Область 1 (+,+)
Область 2 (-,+)
Область 3 (-,-)
Область 4 (+,-)
Когда вводится точка, проверяем не лежит ли она на оси.
Если лежит, то просто переходим к вводу очередной точки.
Далее определяем в какой области эта точка находится 1,2,3 или 4. Записываем в массив областей под ее номером, что такая точка уже есть.
Далее смотрим, есть ли точка в противоположной области. Если есть, то увеличиваем количесто отрезков пересекающих обе оси на 1.

 

var i,k,obl,x,y,N: Integer;
    Oblast: array[1..4] of boolean;

begin
  ReadLn(N);
  k:=0;
  Oblast[1]:=false;
  Oblast[2]:=false;
  Oblast[3]:=false;
  Oblast[4]:=false;
  for i:=1 to N do
    begin
      ReadLn(x,y);
      if (x=0) or (y=0) then continue;
      if (x>0) and (y>0) then Obl:=1;
      if (x<0) and (y>0) then Obl:=2;
      if (x<0) and (y<0) then Obl:=3; 
      if (x>0) and (y<0) then Obl:=4;
      Oblast[obl]:=true;
      if obl=1 then if Oblast[3]=true then k:=k+1;
      if obl=2 then if Oblast[4]=true then k:=k+1;
      if obl=3 then if Oblast[1]=true then k:=k+1;
      if obl=4 then if Oblast[2]=true then k:=k+1;
      end;
    end;
  WriteLn(k);
end.
С4